/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "节点数据声明.h"

#include "MBT_Engine.h"
#include <文件/file_文件名数据.h>
#include <材质/预设材质.h>



typedef struct {
	//void
}S_线程项;


typedef enum : uint8 {
	e_网格编辑_无,
	e_网格编辑_顶点,
	e_网格编辑_权重,
	e_网格编辑_纹理,
}E_网格编辑模式;

typedef struct {
	S_Props 当前帧;
	S_Props 帧区间;
	S_Props 子帧;
}S_时间帧;




struct S_NodeCtx_模拟计算 {
	//static std::mutex	物理模拟线程锁;
	//static uint8		线程模拟物理参数数量;
	static bool		g_是否更新节点;
	static bool		g_结束模拟解算;
	static S_Props	g_是否开启解算;
	static S_Props	g_节点解算;
};





void	f_NodeCtx_全局初始化();
void	f_NodeCtx_全局释放();
void	f_NodeCtx_清除全局数据();

void	f_NodeCtx_set默认场景(S_Scene* scene);

void	f_NodeCtx_set场景根物体(S_设备环境& ctx);
void	f_NodeCtx_初始化物体材质(S_设备环境& ctx);
//void	f_NodeCtx_set帧(S_时间帧& 帧);
void	f_NodeCtx_set当前帧(int64 帧);
void	f_NodeCtx_set帧区间(ivec2 区间);


S_Scene*	f_NodeCtx_get默认场景();
S_物体*		f_NodeCtx_get当前独立显示物体();
S_物体*		f_NodeCtx_get场景根物体();
S_时间帧&	f_NodeCtx_get帧();
void		f_NodeCtx_set场景当前时间(int32 t);


void					f_NodeCtx_set焦点物体(std::vector<S_物体*>& objs);
std::vector<S_物体*>&	f_NodeCtx_get焦点物体();
//std::vector<C_Widget*>&	f_NodeCtx_get焦点节点(std::vector<S_物体*>& objs);
void f_NodeCtx_录物体类节点(class C_节点基类* 节点);
void f_NodeCtx_录物体类节点(class C_节点基类* 节点, S_物体* ob);
void f_NodeCtx_清除物体类节点(S_物体* ob);
std::vector<class C_节点基类*> f_NodeCtx_从可视物体取节点(const std::vector<S_物体*>& obs);





S_单色材质* f_NodeCtx_get单色点材质();
S_单色材质* f_NodeCtx_get单色线材质();
S_单色材质* f_NodeCtx_get单色面材质();
S_单色材质* f_NodeCtx_get单色平直面材质();
S_单色材质* f_NodeCtx_get单色描边材质();
//S_单色材质包	f_NodeCtx_get骨骼材质();


S_材质* f_NodeCtx_get基本光照描边材质();
S_材质* f_NodeCtx_get基本光照线材质();
S_材质* f_NodeCtx_get基本光照面材质();
S_材质* f_NodeCtx_get权重可视线材质();
S_材质* f_NodeCtx_get权重可视面材质();


S_材质* f_NodeCtx_get逐顶点线段材质(bool 统一朝向 = false);
S_材质* f_NodeCtx_get逐顶点连续线材质();
S_材质* f_NodeCtx_get逐顶点点材质();

S_材质* f_NodeCtx_get灯光模型中心圆材质(S_设备环境& ctx);
S_材质* f_NodeCtx_get灯光模型范围线材质(S_设备环境& ctx);
S_材质* f_NodeCtx_get灯光模型方向线材质(S_设备环境& ctx);
S_材质* f_NodeCtx_get区域灯光模型点材质(S_设备环境& ctx);

S_材质* f_NodeCtx_get单虚拟体材质(S_设备环境& ctx);


S_材质* f_NodeCtx_get虚拟体中心圆材质(S_设备环境& ctx);
S_材质* f_NodeCtx_get虚拟体范围线材质(S_设备环境& ctx);
S_材质* f_NodeCtx_get虚拟体方向线材质(S_设备环境& ctx);

S_材质* f_NodeCtx_get单元素虚拟体材质(S_设备环境& ctx);


S_材质* f_NodeCtx_get线段描边材质();
S_材质* f_NodeCtx_get单色线段材质();
S_材质* f_NodeCtx_get单色连续线材质();
S_材质* f_NodeCtx_get单色连续虚线材质();
S_材质* f_NodeCtx_get单色线段虚线材质();






void f_NodeCtx_删除物体到回收站(S_物体* ob);
S_物体* f_NodeCtx_回收物体();

void f_NodeCtx_物体显示模型(E_物体显示模式 模式);
void f_NodeCtx_物体显示模型(S_物体* ob, E_物体显示模式 模式);
void f_NodeCtx_物体线模式显示(S_物体* ob);
void f_NodeCtx_物体面模式显示(S_物体* ob);
void f_NodeCtx_物体线面模式显示(S_物体* ob);



//bool f_NodeCtx_更新();
//bool f_NodeCtx_停止更新();





struct S_节点UI主题 {
	static S_RGBA8UI uic_I8;
	static S_RGBA8UI uic_UI8;
	static S_RGBA8UI uic_I16;
	static S_RGBA8UI uic_UI16;
	static S_RGBA8UI uic_I32;
	static S_RGBA8UI uic_UI32;
	static S_RGBA8UI uic_I64;
	static S_RGBA8UI uic_UI64;
	static S_RGBA8UI uic_F32;
	static S_RGBA8UI uic_vec2;
	static S_RGBA8UI uic_vec3;
	static S_RGBA8UI uic_vec4;
	static S_RGBA8UI uic_mat2X2;
	static S_RGBA8UI uic_mat3X2;
	static S_RGBA8UI uic_mat4X2;
	static S_RGBA8UI uic_mat2X3;
	static S_RGBA8UI uic_mat3X3;
	static S_RGBA8UI uic_mat4X3;
	static S_RGBA8UI uic_mat4X4;

	static S_RGBA8UI uic_模型面;
	static S_RGBA8UI uic_模型线;
	static S_RGBA8UI uic_模型焦点;

	static S_RGBA8UI uic_对象;
	static S_RGBA8UI uic_物体;
	static S_RGBA8UI uic_解算器;
	static S_RGBA8UI uic_链接线;
	static S_RGBA8UI uic_链接线链接;
	static S_RGBA8UI uic_主线辅线;
	static S_RGBA8UI uic_网格辅线;
	static S_RGBA8UI uic_刻度线L1;
	static S_RGBA8UI uic_刻度线L2;

	static S_RGBA8UI uic_骨骼面物体状态;
	static S_RGBA8UI uic_骨骼边物体状态;
	static S_RGBA8UI uic_骨骼面编辑状态;
	static S_RGBA8UI uic_骨骼边编辑状态;
	static S_RGBA8UI uic_骨骼编辑焦点;
	static S_RGBA8UI uic_骨节编辑焦点;

	static std::string	ui_默认字体;
	static std::string	ui_节点图标;

	S_节点UI主题();

};









